Function.prototype._call = function(obj,...args) {
    const _this = this;
    const fn = Symbol('fn');
    obj[fn] = _this;
    obj[fn](...args)
    delete obj[fn]
}
Function.prototype._apply = function(obj,args) {
    const _this = this;
    const fn = Symbol('fn');
    obj[fn] = _this;
    obj[fn](...args);
    delete obj[fn]
}
Function.prototype._bind = function(obj,...outer) {
    const _this = this;
    return function (...inner) {
        _this._apply(obj,[...outer,...inner])
    }
}

const obj = {name: '张润钊'};
function test(num1,num2) {
    console.log(this.name,num1,num2)
}
test._call(obj,1,2)
test._apply(obj,[1,2])
const testBind =  test._bind(obj,1);
testBind(2);